package CamposDePotencial;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import javax.vecmath.Point3d;

import CamposDePotencial.FabricaPotenciales.PAREDES;

import estrategia.Utiles;
import estrategia.Vector;

public class CampoSemiplano extends CampoPotencial {

	private final double PARED_IZQ = 0;
	private final double PARED_ABAJO = 0;
	private final double  PARED_DER = 2.1;
	private final double PARED_ARRIBA = 1.8;
	private double radioCampo;
	private double tamanioRobot;
	private double Krepulsion;
	
	private double angulo;
	private Point3d pared;
	
	private Properties prop;
	private final String pathConfig = "src/CamposDePotencial/Configuracion/CampoSemiplano.properties";
	
	
	public CampoSemiplano(PAREDES p, Utiles utiles) {
		// TODO Auto-generated constructor stub
		super(null, utiles);
		// angulo depende de las paredes
		switch(p) {
			case ARRIBA:
				angulo = -Math.PI/2;
			case ABAJO:
				angulo = Math.PI/2;
			case IZQ:
				angulo = 0;
			case DER:
				angulo = Math.PI;
		}
	}
	
	public void  cargarConstantes() {
		prop = new Properties();
		try {
			InputStream istream = new FileInputStream(pathConfig);
			prop.load(istream);
		} catch (FileNotFoundException e) {
			System.out.println("No se encontro el archivo de configuracion");
		} catch (IOException e) {
			System.out.println("Se produjo un error al levantar el archivo de configuracion");
		}
		
		radioCampo = Double.parseDouble(prop.getProperty("RADIO_CAMPO"));
		Krepulsion = Double.parseDouble(prop.getProperty("K_REPULSION"));
		tamanioRobot = Double.parseDouble(prop.getProperty("TAM_ROBOT"));
	}
	
	
	public Point3d getPared(Point3d p) {
		if (angulo == 0) 
			return new Point3d(PARED_IZQ, p.y, 0);
		else if (angulo ==Math.PI/2) 
			return new Point3d(p.x, PARED_ABAJO, 0);
		else if (angulo == Math.PI) 
			return new Point3d(PARED_DER, p.y, 0);
		else 
			return new Point3d(PARED_ARRIBA, p.y, 0);
		
	}
	
	public double getMagnitudFuerza(Point3d mipos) {
		double magnitud = 0;
		pared = getPared(mipos);
		double distancia = utiles.distanciaEuclidea(mipos, pared);
		distancia = distancia - tamanioRobot;
		
		if (distancia <= radioCampo) {
			// *(1/(Math.pow(distancia, 2)))
			magnitud = Krepulsion*((1/distancia) - (1/radioCampo));
		}
		
		return magnitud;
	}
	
	public Vector obtenerFuerza(Point3d mipos){
		
		cargarConstantes();
		
		double direccion = angulo;
		
		double magnitud = getMagnitudFuerza(mipos);
		 
		Vector resultante = new Vector(magnitud, direccion);  
		
		return resultante;
	};

}
